#ifndef PRINT_HPP
#define PRINT_HPP

#include "common.hpp"
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <iostream>

using std::ostream;
using std::set;
using std::string;
using std::vector;


// Print vector<T>.
//template<typename T> void print(const vector<T>& vec);
template<typename T> ostream& operator <<(ostream& os, const vector<T> & vec);

template<typename S, typename T> ostream& operator <<(ostream& out, const map<S, T>& m);

// Return string value of vector<T>.
template<typename T> string stringval(const vector<T>& vec);

// Print string value of pair<S, T>
template<typename S, typename T> string stringval(const std::pair<S, T>& p);

// Print pair<S, T>
template<typename S, typename T> void print(const std::pair<S, T>& p);

// Print set<T>.
template<typename T> ostream& operator <<(ostream& out, const set<T> & s);

// Return value of boost::array<T, dim> as string.
template<typename T, int dim> string stringval(const boost::array<T, dim>& arr);

// Print boost::array<T, dim>.
template<typename T, int dim> ostream& operator <<(ostream& out, const boost::array<T, dim> & arr);

//template<typename T, int dim> void print(const vector<boost::array<T, dim> >& lst);
template<typename T, int dim> ostream& operator <<(ostream& out, const vector<boost::array<T, dim> >& lst);


#endif
